如果類別本身已經濟成某個婦類別,但現在又要繼承Thread類別來建立執行緒,馬上就會面臨到一個問題-JAVA不能多重繼承,換言之,不能繼承某個類別之後,又同時繼承Thread類別。
實作Runnable介面來建立執行緒介面是實現多重繼承的重要方式
,JAVA提供Runnable介面,恰好可以解決這個難題。Runnable介面裡已定義抽象的run(),因此只要在類別裡確實定義run(),也就是把處理執行緒的程式碼放在run()裡,即可建立執行緒。
class Test implements Runnable{ //由Test類別實作Runnable介面
...
public void run(){ //詳細定義runnable()介面裡的run()函數
for(int i=0;i<4;i++){
for(int j=0;j<1000000;j++); //空迴圈
System.out.println("id+" is runnung..");
}
}
...
public static void main(String args[]){
Thread t1 = new Thread(dog); //產生Thread類別產生物件t1
Thread t2 = new Thread(cat); //產生Thread類別產生物件t2
t1.start(); //用t1啟動執行緒
t2.start(); //用t2啟動執行緒
}
}
執行緒的生命週期
每一個執行緒,在其產生和銷毀之前,均會處於以下五個狀態:新產生的(newly created)、可執行的(runable)、執行中的(running)、被凍結的(blocked)和銷毀的(dead)狀態。這五種狀態都可以透過Thread類別所提供的函數來呼叫。
新產生的執行緒
當我們用new Thread()建立物件時,執行緒便馬上進入這個狀態,但此時系統並不會配置資源,直到用start()啟動執行緒才會配置。
可執行的狀態
當start()啟動執行緒時,執行緒便進入可執行的狀態。最先搶到的CPU資源的執行緒先開始執行run(),其餘的執行緒便在佇列(queue)中等待機會爭取CPU資源,一旦爭取到便開始執行。
執行中的狀態
最先搶到的CPU資源的執行緒會開始執行run(),此時進入執行的狀態。一次只會有一個執行緒處在「執行的狀態」中。
被凍結的狀態
以下事件發生時,凍結狀態就會發生:
(1)該執行緒呼叫物件的wait()函數。
(2)該執行緒本身呼叫sleep()函數。sleep可用來設定睡眠的時間為毫秒。
(3)該執行緒和另一個執行緒join()在一起時。當某一執行緒呼叫join()時,則原來正在執行的執行緒或程式碼會先暫停,等到該執行緒結束才會再繼續執行。
當執行緒被凍結時,便停止run()的執行,直到被凍結的因素消失後執行緒便回到可執行的狀態,繼續排隊爭取CPU的資源。被凍結的因素消失的原因有以下幾點:
(1)如果執行緒是由呼叫物件的wait()所凍結,則該物件的notify()被呼叫時可解除凍結。
(2)執行緒進入睡眠(sleep)狀態,但指定的睡眠時間已到。
銷毀的狀態
當執行緒run()執行結束時,或是由執行緒呼叫它的stop()時,此時執行緒進入銷毀的狀態。當執行緒處於銷毀狀態之後,無法再次啟動該執行緒。
回到開始寫文的前幾天(大篇幅!!!
怕鐵人賽要結束還打不完XDD
See U tomorrow:))
菜鳥工程師也有分享食記,歡迎大家追蹤喔~~
https://instagram.com/engineer_bodyfat?utm_medium=copy_link